package main

import (
	"BookStack/cmd"
	"flag"
	"fmt"
	"log"
	"os"
)

// 命令定义
const (
	CmdServe   = "serve"
	CmdInstall = "install"
	CmdMigrate = "migrate"
	CmdVersion = "version"
)

// 版本信息
const (
	AppName    = "BookStack"
	AppVersion = "1.0.0"
)

func main() {
	// 定义帮助标志
	helpFlag := flag.Bool("help", false, "显示帮助信息")
	versionFlag := flag.Bool("version", false, "显示版本信息")

	// 解析命令行参数
	flag.Parse()

	// 显示版本信息
	if *versionFlag {
		fmt.Printf("%s 版本 %s\n", AppName, AppVersion)
		return
	}

	// 显示帮助信息
	if *helpFlag || flag.NArg() == 0 {
		showHelp()
		return
	}

	// 获取命令
	cmd := flag.Arg(0)

	// 执行对应的命令
	switch cmd {
	case CmdServe:
		if err := runServe(); err != nil {
			log.Fatalf("启动服务器失败: %v", err)
		}
	case CmdInstall:
		if err := runInstall(); err != nil {
			log.Fatalf("安装初始数据失败: %v", err)
		}
	case CmdMigrate:
		if err := runMigrate(); err != nil {
			log.Fatalf("执行数据库迁移失败: %v", err)
		}
	case CmdVersion:
		fmt.Printf("%s 版本 %s\n", AppName, AppVersion)
	default:
		fmt.Printf("未知命令: %s\n", cmd)
		showHelp()
		os.Exit(1)
	}
}

// showHelp 显示帮助信息
func showHelp() {
	fmt.Printf("使用方法: %s [选项] 命令\n\n", os.Args[0])
	fmt.Println("选项:")
	flag.PrintDefaults()
	fmt.Println("\n命令:")
	fmt.Println("  serve   启动API服务器")
	fmt.Println("  install 安装初始数据")
	fmt.Println("  migrate 执行数据库迁移")
	fmt.Println("  version 显示版本信息")
}

// runServe 运行服务器
func runServe() error {
	return runCmd("serve")
}

// runInstall 运行安装
func runInstall() error {
	fmt.Println("正在安装初始数据...")
	if err := cmd.Install(); err != nil {
		return fmt.Errorf("安装初始数据失败: %v", err)
	}
	fmt.Println("安装完成")
	return nil
}

// runMigrate 运行数据库迁移
func runMigrate() error {
	fmt.Println("正在执行数据库迁移...")
	if err := cmd.MigrateDB(); err != nil {
		return fmt.Errorf("执行数据库迁移失败: %v", err)
	}
	fmt.Println("迁移完成")
	return nil
}

// runCmd 运行指定的子命令
func runCmd(name string) error {
	// 所有命令都在cmd包中直接实现
	switch name {
	case "serve":
		return cmd.Serve()
	case "migrate":
		return cmd.MigrateDB()
	case "install":
		return cmd.InstallDB()
	default:
		return fmt.Errorf("未知的子命令: %s", name)
	}
}
